/*
 *    This program is free software; you can redistribute it and/or modify
 *    it under the terms of the GNU General Public License as published by
 *    the Free Software Foundation; either version 2 of the License, or
 *    (at your option) any later version.
 *
 *    This program is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *    GNU General Public License for more details.
 *
 *    You should have received a copy of the GNU General Public License
 *    along with this program; if not, write to the Free Software
 *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *    2010 year
 *    Author: erfea (Edvard)
 *    E-Mail: erfea.tux@gmail.com
 */

#ifndef TSPL_SE_STD_H
#define TSPL_SE_STD_H

#define PLUGIN_NAME "se_std"


#include <QtCore/QtPlugin>
#include <QObject>
#include <QtSql>
#include <QDebug>
#include "iface_seplugin.h"

class Tspl_se_std_engine;

class Tspl_se_std: public TsIfaceSePlugin{
    Q_OBJECT
	Q_INTERFACES(TsIfaceSePlugin)
public:
		virtual ~Tspl_se_std();
        // метод выполняющий инициализацию плагина
		virtual bool qinit(const QStringList & cfgstr);
		//метод толкащий первый запрос из очереди, если это возможно
		void nextQuery();

private:
		//int id; // идентификатор обрабатываемого запроса
		struct Query{//внутренее представление запроса для очереди
			QString name;//имя запроса
			QList<QVariant> params;//параметры запроса
			Tspl_se_std_engine* sender;//запросивший объект, если 0 this
		};
		QMultiHash<QString,Tspl_se_std_engine*> mEngines;//хеш указателей на запущенные скрипты
		QList<Query> mQueryes;//очередь запросов
		bool mWaitQuery;//ожидание ответа от плагина бд
		QHash<QString,QObject*> mRootWidgets;//главные окна wrk плагинов

public slots:
        // асинхронный режим
        // слот получения ответа от плагина бд
        void slotDb(const QString & plName , int id,QSqlQuery * ret);
        void slotDbErr(const QString & plName , const QString & errtext);
        // синхронный режим.
        void slotRstartS(const QString pl_name);
        // ответ положительный с данными по запросу.
        void slotFinishS(const QString & plName , QSqlQuery * ret);
        // ответ отрицательный с данными по ошибке
        void slotFinishErrS(const QString & plName , const QString & errtext);
		// слот для прогруза скриптов, принимает имя запросившего плагина и корневой виджет
		void slotLoad(const QString &pl_name, bool cann_write, QObject *root_widget);
		//слот добавления запроса в очередь
		void slotAddQuery(const QString &name, const QList<QVariant> &params, Tspl_se_std_engine *sender = 0);

signals:
        // сигнал запроса в базу данных. асинхронный режим
        void sigQexec(const QString pl_name,const QString & fname,const QList<QVariant> & parameters);
        void sigPutLog(const QString & owner,int level,const QString & text);
        void sigClear(int id);
        // синхронный режим
        // первый запрос от плагина на начала синхронного режима.
        void sigQstartS(const QString & pl_name);
        // запрос в базу в асинхронном режиме
        void sigQexecS(const QString pl_name,const QString & fname,const QList<QVariant> & parameters);
        // сигнал окончания работы в синхронном режиме
		void sigQstopS(const QString & pl_name);



};
#endif

